# coding=utf-8

class TileMapException(Exception):
        pass

class TileMap:
        def __init__(self, bwmap, dim):
                self.bwmap = bwmap
                self.groupmap = {}
                self.takenmap = {}
                self.dim = dim

        def _check_coords(self, xy):
                if xy[0] < 0 or xy[0] >= self.dim[0] or xy[1] < 0 or xy[1] >= self.dim[1]:
                        raise TileMapException("Point is out of bounds of image");

        def is_taken(self, xy):
                """
                        Zwraca:
                        - prawde, jesli x,y jest zajete,
                        - falsz wpp.
                """
                self._check_coords(xy)
                return xy in self.takenmap

        def is_there(self, thing, xy, not_on_board_ok=False):
                """
                        Zwraca:
                        - jesli xy jest poza plansza, to not_on_board_ok
                        - jesli thing==., prawda jesli x,y bialy
                        - jesli thing==#, prawda jesli x,y czarny
                        - jesli thing==*, prawda
                        - jesli thing==cokolwiek innego, prawda jesli w x,y jest grupa cokolwiek
                """
                try:
                    self._check_coords(xy)
                except TileMapException:
                    return not_on_board_ok
                if "*" == thing:
                        return True
                if thing in [".", "#"]:
                        return self.bwmap[xy] == thing
                try:
                        if thing in self.groupmap[xy]:
                                return True
                        return False
                except KeyError:
                        pass
                return False

        def set_field(self, groups, xy):
                """
                        Ustawia polu x,y grupy na groups oraz ustawia zajetosc
                """
                self._check_coords(xy)
                if xy in self.takenmap:
                        raise TileMapException("WTF, nie ma nadpisywania pol wczesniej zajetych")
                self.groupmap[xy] = groups
                self.takenmap[xy] = True
